﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Leetcode_Array.Script.StackAndQueue
{
    // ===================================== 力扣225 用队列实现栈
    //请你仅用两个队列实现一个后入先出的栈，并支持普通栈的四种操作（push,top,pop和empty)

    class MyStack
    {// ============= 双队列模拟

        Queue<int> que1;
        Queue<int> que2;

        public MyStack()
        {
            que1 = new Queue<int>();
            que2 = new Queue<int>();
        }

        //将元素x压入栈
        public void Push(int x)
        {
            que1.Enqueue(x);
        }

        //移除并返回栈顶元素
        public int Pop()
        {
            int size = que1.Count;
            size--;
            while(size-- > 0)//将que1导入que2，但要留下最后一个元素
            {
                que2.Enqueue(que1.Dequeue());
            }

            int result = que1.Dequeue();//留下的最后一个元素就是要返回的值
            que1 = new Queue<int>(que2);//将que2赋值给que1
            que2.Clear();//再将que2清空
            return result;
        }


        //返回栈顶元素
        public int Top()
        {
            return que1.LastOrDefault(); 
        }

        //如果栈是空的，返回true；否则返回false
        public bool Empty()
        {
            return que1 == null || que1.Count == 0;
        }
    }

    class MyStack_2
    {// ============================== 单队列模拟
        Queue<int> que;

        MyStack_2()
        {
            que = new Queue<int>();
        }

        public void Push(int x)
        {
            que.Enqueue(x);
        }

        public int Pop()
        {
            int size = que.Count;
            size--;
            while(size-- > 0)
            {
                que.Enqueue(que.Dequeue());
            }
            return que.Dequeue();
        }

        public int Top()
        {
            return que.LastOrDefault();
        }

        public bool Empty()
        {
            return que == null || que.Count == 0;
        }
    }
}
